*** amicon.c.orig	Sat Oct  1 06:39:00 1994
--- amicon.c	Tue Nov 15 17:03:46 1994
***************
*** 9,14 ****
--- 9,22 ----
  **          - 24-bit color palette
  **      Modified 19-June-94 by Geert Uytterhoeven
  **          - cursor flashing for better cursor visibility
+ **      Modified 18-August-94 by Jes Sorensen (jds@kom.auc.dk)
+ **          - ECS support. The following screen-modes are included:
+ **              multiscan, multiscan-lace, super72, super72-lace, dblntsc,
+ **              dblpal & euro72.
+ **            I suggest that we remove the old AGA screenmodes, as they are
+ **              non-standard, and some of them doesn't work under ECS.
+ **      Minor cleanup on 15-November-94, first release of the ECS-screenmodes.
+ **            (Jes)
  **
  **  Interface based on the original 'amicon.c' code:
  **      Copyright (C) 1993 Hamish Macdonald and Greg Harp
***************
*** 176,181 ****
--- 184,191 ----
      ushort diwstrt_v, diwstrt_h;   /* display window control */
      ushort diwstop_v, diwstop_h;
      ushort bplcon0;                /* display mode */
+     ushort htotal;                 /* htotal is used to calc the pal-line, */
+                                    /* though I don't know if it is right.  */
  
      ulong fgcol;               /* 24-bit text colors */
      ulong bgcol;
***************
*** 195,201 ****
      ushort *coplist2dyn;   /* List 2 dynamic component */
      };
  
- 
  /* Geometry structure contains all useful information about given mode.
   *
   * Strictly speaking `scr_max_height' and `scr_max_width' is redundant
--- 205,210 ----
***************
*** 208,218 ****
   * available, without confusing the poor chipset. OCS modes use only the
   * bplcon0, diwstrt, diwstop, ddfstrt, ddfstop registers (a few others could
   * be used as well). -wjr
   */
-  
  struct geometry {
      char *modename;	/* Name this thing */
!     char isOCS;		/* Is it OCS or AGA */
      ushort bplcon0;	/* Values for bit plane control register 0 */
      ushort scr_width;
      ushort scr_height;
--- 217,230 ----
   * available, without confusing the poor chipset. OCS modes use only the
   * bplcon0, diwstrt, diwstop, ddfstrt, ddfstop registers (a few others could
   * be used as well). -wjr
+  *
+  * The code now supports ECS aswell, except for FMODE all control registers
+  * are the same under ECS. A special color-table has to be generated though.
+  * -Jes
   */
  struct geometry {
      char *modename;	/* Name this thing */
!     char isOCS;		/* Is it OCS or ECS/AGA */
      ushort bplcon0;	/* Values for bit plane control register 0 */
      ushort scr_width;
      ushort scr_height;
***************
*** 264,269 ****
--- 276,289 ----
  static int do_unblank;
  
  /*
+  * ecs_color_zero is used to keep custom.color[0] for the special ECS color-
+  * table, as custom.color[0] is cleared at vblank interrupts.
+  * -Jes (jds@kom.auc.dk)
+  */
+ 
+ static ushort ecs_color_zero;
+ 
+ /*
  ** Functions
  */
  
***************
*** 347,352 ****
--- 367,378 ----
   * Wait(diwstop_h-2, 0xff) to make it work with the additional
   * `get-all-you-can-get-out-of-it' AGA modes. Maybe we should derive the
   * wait position from the HTOTAL value? - G.U.
+  *
+  * The Wait(diwstop_h-2, 0xff) didn't work in Super72 under ECS, instead
+  * I changed it to Wait(htotal-4, 0xff). Dunno whether it works under AGA,
+  * and don't ask my why it works. I'm trying to get some facts on this issue
+  * from Commodore.
+  * -Jes
   */
  
  static __inline__ ushort *
***************
*** 403,415 ****
  
      for (i = 0 ; i < p->scr_depth ; i++) {
          scrmem    = ((long)p->bitplane[i]) + offset;
          if (shf)
              scrmem += p->bytes_per_row;
  
          *cop++ = CUSTOM_OFS(bplpt[i]);
!         *cop++ = (long)scrmem >> 16;
          *cop++ = CUSTOM_OFS(bplpt[i]) + 2;
!         *cop++ = (long)scrmem;
      }
  
      /* If wrapped frame needed - wait for line then switch bitplXs */
--- 429,442 ----
  
      for (i = 0 ; i < p->scr_depth ; i++) {
          scrmem    = ((long)p->bitplane[i]) + offset;
+ 
          if (shf)
              scrmem += p->bytes_per_row;
  
          *cop++ = CUSTOM_OFS(bplpt[i]);
!         *cop++ = (long)(scrmem) >> 16;
          *cop++ = CUSTOM_OFS(bplpt[i]) + 2;
!         *cop++ = (long)(scrmem);
      }
  
      /* If wrapped frame needed - wait for line then switch bitplXs */
***************
*** 426,437 ****
--- 453,483 ----
          while (line > 256) {
  	    /* Hardware limitation - 8 bit counter    */
  	    /* Wait(diwstop_h-2, 0xff) */
+ 	  if (p->bplcon0 & BPC0_SHRES)
+ 
+ /*
+  * htotal-4 is used in SHRES-mode, as diwstop_h-2 doesn't work under ECS.
+  * Does this work under AGA?
+  * -Jes
+  */
+ 	    *cop++ = 0xff00 | ((p->htotal-4) | 1);
+ 	  else 
              *cop++ = 0xff00 | ((diwstop_h-2) >> 1) | 0x1;
+ 
              *cop++ = 0xfffe;
  	    /* Wait(0, 0) - make sure we're in the new segment */
              *cop++ = 0x0001;
              *cop++ = 0xfffe;
  	    line -= 256;
+ 
+ /*
+  * Under ECS we have to keep color[0], as it is part of a special color-table.
+  */
+ 
+       if (boot_info.bi_amiga.chipset == CS_ECS && p->bplcon0 & BPC0_ECSENA) {
+ 	  *cop++ = 0x0180;
+ 	  *cop++ = ecs_color_zero;
+ 	}
  	    }
  	
  	/* Wait(diwstop_h, line - 1) */
***************
*** 440,446 ****
  
          for (i = 0 ; i < p->scr_depth ; i++) {
              scrmem = (long)p->bitplane[i];
-         
              if (shf)
                  scrmem += p->bytes_per_row;
  
--- 486,491 ----
***************
*** 499,505 ****
  	    ((hs & 0x000001fe) << 15) | (hs & 0x00000001) | 
  	    ((ve & 0x000000ff) << 8) | ((ve & 0x00000100) >> 7));
         }
!    }
  
  static void amicon_interrupt(struct intframe *fp, void *data)
  {
--- 544,551 ----
  	    ((hs & 0x000001fe) << 15) | (hs & 0x00000001) | 
  	    ((ve & 0x000000ff) << 8) | ((ve & 0x00000100) >> 7));
         }
!  }
! 
  
  static void amicon_interrupt(struct intframe *fp, void *data)
  {
***************
*** 513,519 ****
      * At least it goes awfully perculiar on my A500 without the following
      * test. Not really in a position to test this hypothesis, so sorry
      * for the slow scrolling, all you flicker-fixed souls
!    */
  
     if (!(p->bplcon0 & BPC0_LACE) || (custom.vposr & 0x8000)) {
         if (p->scroll_latch || p->cursor_latch)
--- 559,565 ----
      * At least it goes awfully perculiar on my A500 without the following
      * test. Not really in a position to test this hypothesis, so sorry
      * for the slow scrolling, all you flicker-fixed souls
!     */
  
     if (!(p->bplcon0 & BPC0_LACE) || (custom.vposr & 0x8000)) {
         if (p->scroll_latch || p->cursor_latch)
***************
*** 555,562 ****
  	   custom.color[0]  = 0;
  	   custom.bplcon3   = save_bplcon3;
         }
         do_blank = 0;
!    }
  
     if (do_unblank) {
         custom.dmacon = DMAF_SETCLR | DMAF_RASTER | DMAF_SPRITE;
--- 601,609 ----
  	   custom.color[0]  = 0;
  	   custom.bplcon3   = save_bplcon3;
         }
+ 
         do_blank = 0;
!      }
  
     if (do_unblank) {
         custom.dmacon = DMAF_SETCLR | DMAF_RASTER | DMAF_SPRITE;
***************
*** 567,581 ****
  	   custom.bplcon3   = save_bplcon3 | BPC3_LOCT;
  	   custom.color[0]  = COLOR_LSB(p->bgcol);
  	   custom.bplcon3   = save_bplcon3;
!        }
         do_unblank = 0;
!    }
  
     vblank.done  = 1;
! }
  
  /* ====================================================================== */
  
  
  /* display_init():
   *
--- 614,691 ----
  	   custom.bplcon3   = save_bplcon3 | BPC3_LOCT;
  	   custom.color[0]  = COLOR_LSB(p->bgcol);
  	   custom.bplcon3   = save_bplcon3;
! 	 }
!       /* color[0] is set to ecs_color_zero under ECS */
!       if (boot_info.bi_amiga.chipset == CS_ECS && p->bplcon0 & BPC0_ECSENA) {
!            custom.color[0]  = ecs_color_zero;
!       }
         do_unblank = 0;
!      }
  
     vblank.done  = 1;
!  }
! 
  
  /* ====================================================================== */
  
+ void build_ecs_colors(ushort color1, ushort color2, ushort color3, 
+                       ushort color4, ushort *table)
+ {
+ /*
+  * This function calculates the special ECS color-tables needed when running
+  * new screen-modes available under ECS. See the hardware reference manual
+  * 3rd edition for details.
+  * -Jes
+  */
+ ushort  t;
+ 
+         t = (color1 & 0x0ccc);
+         table[0] = t;
+         table[4] = t;
+         table[8] = t;
+         table[12] = t;
+         t = t >> 2;
+         table[0] = (table[0] | t);
+         table[1] = t;
+         table[2] = t;
+         table[3] = t;
+ 
+         t = (color2 & 0x0ccc);
+         table[1] = (table[1] | t);
+         table[5] = t;
+         table[9] = t;
+         table[13] = t;
+         t = t >> 2;
+         table[4] = (table[4] | t);
+         table[5] = (table[5] | t);
+         table[6] = t;
+         table[7] = t;
+ 
+         t = (color3 & 0x0ccc);
+         table[2] = (table[2] | t);
+         table[6] = (table[6] | t);
+         table[10] = t;
+         table[14] = t;
+         t = t >> 2;
+         table[8] = (table[8] | t);
+         table[9] = (table[9] | t);
+         table[10] = (table[10] | t);
+         table[11] = t;
+ 
+         t = (color4 & 0x0ccc);
+         table[3] = (table[3] | t);
+         table[7] = (table[7] | t);
+         table[11] = (table[11] | t);
+         table[15] = t;
+         t = t >> 2;
+         table[12] = (table[12] | t);
+         table[13] = (table[13] | t);
+         table[14] = (table[14] | t);
+         table[15] = (table[15] | t);
+ 
+ }
+ 
+ /* ====================================================================== */
  
  /* display_init():
   *
***************
*** 585,592 ****
  static void display_init(struct display *p,
                           struct geometry *geom, ushort inverse)
  {
!    int i;
!    char *chipptr;
     ushort diwstrt_v, diwstop_v;
     ushort diwstrt_h, diwstop_h;
     ushort diw_min_h, diw_min_v;
--- 695,703 ----
  static void display_init(struct display *p,
                           struct geometry *geom, ushort inverse)
  {
!    ushort ecs_table[16];
!    int    i;
!    char   *chipptr;
     ushort diwstrt_v, diwstop_v;
     ushort diwstrt_h, diwstop_h;
     ushort diw_min_h, diw_min_v;
***************
*** 616,621 ****
--- 727,736 ----
     p->fontheight     = fontheight;
     p->fontwidth      = fontwidth;
     p->bplcon0        = geom->bplcon0 | BPC0_COLOR;
+    p->htotal         = geom->htotal;
+ 
+ /* htotal was added, as I use it to calc the pal-line. -Jes */
+ 
     if (p->scr_depth < 8) {
         p->bplcon0 |= (p->scr_depth << 12);
         }
***************
*** 668,678 ****
         ddfstrt = (diwstrt_h >> 1) - 4;
         ddfstop = ddfstrt + (4 * (p->bytes_per_row>>1)) - 8;
         }
!    else if (p->bplcon0 & BPC0_SHRES) {
         /* There may be some interaction with FMODE here... -8 is magic. */
         ddfstrt = (diwstrt_h >> 1) - 8;
         ddfstop = ddfstrt + (2 * (p->bytes_per_row>>1)) - 8;
!        }
     else {
         ddfstrt = (diwstrt_h >> 1) - 8;
         ddfstop = ddfstrt + (8 * (p->bytes_per_row>>1)) - 8;
--- 783,812 ----
         ddfstrt = (diwstrt_h >> 1) - 4;
         ddfstop = ddfstrt + (4 * (p->bytes_per_row>>1)) - 8;
         }
!    else if (p->bplcon0 & BPC0_SHRES && boot_info.bi_amiga.chipset == CS_AGA) {
         /* There may be some interaction with FMODE here... -8 is magic. */
+ 
+        /*
+         * This shoud be fixed, so it supports all different FMODE's.
+         * FMODE varies the speed with 1,2 & 4 the standard ECS speed.
+         * Someone else has to do it, as I don't have an AGA machine with MMU
+         * available here.
+         *
+         * This particular speed looks like FMODE = 3 to me.
+         * ddfstop should be changed so it depends on FMODE under AGA.
+         * -Jes
+         */
         ddfstrt = (diwstrt_h >> 1) - 8;
         ddfstop = ddfstrt + (2 * (p->bytes_per_row>>1)) - 8;
!      }
!        /* 
!         * Normal speed for ECS, should be the same for FMODE = 0
!         * -Jes
!         */
!    else if (p->bplcon0 & BPC0_SHRES && boot_info.bi_amiga.chipset == CS_ECS){
!        ddfstrt = (diwstrt_h >> 1) - 2;
!        ddfstop = ddfstrt + (2 * (p->bytes_per_row>>1)) - 8;
!      }
     else {
         ddfstrt = (diwstrt_h >> 1) - 8;
         ddfstop = ddfstrt + (8 * (p->bytes_per_row>>1)) - 8;
***************
*** 683,689 ****
     else
        cursorheight = p->fontheight;
  
!    chipptr = amiga_chip_alloc(p->scr_depth*p->plane_size+COP_MEM_REQ+SPR_MEM_REQ+4*(cursorheight-1));
     
     /* locate the bitplanes */
     /* These MUST be 64 bit aligned for full AGA compatibility!! */
--- 817,823 ----
     else
        cursorheight = p->fontheight;
  
!    chipptr = amiga_chip_alloc(p->scr_depth*(p->plane_size)+COP_MEM_REQ+SPR_MEM_REQ+4*(cursorheight-1));
     
     /* locate the bitplanes */
     /* These MUST be 64 bit aligned for full AGA compatibility!! */
***************
*** 702,713 ****
  
     /* create the sprite data for the cursor image */
     memset((void *)p->cursor, 0, 8+4*cursorheight);
!    if (p->bplcon0 & BPC0_ECSENA)
!       /* AGA cursor is SHIRES */
        for (i = 0; (i < p->fontwidth) && (i < 16); i++)
           cursormask |= 1<<(15-i);
     else
!       /* OCS cursor is LORES */
        for (i = 0; (i < p->fontwidth/2) && (i < 8); i++)
           cursormask |= 1<<(15-i);
  
--- 836,850 ----
  
     /* create the sprite data for the cursor image */
     memset((void *)p->cursor, 0, 8+4*cursorheight);
!       /*
!        * Only AGA supplies hires sprites.
!        */
!    if (p->bplcon0 & BPC0_ECSENA && boot_info.bi_amiga.chipset == CS_AGA)
!       /* AGA cursor is SHIRES, ECS sprites differ */
        for (i = 0; (i < p->fontwidth) && (i < 16); i++)
           cursormask |= 1<<(15-i);
     else
!       /* For OCS & ECS sprites are pure LORES 8-< */
        for (i = 0; (i < p->fontwidth/2) && (i < 8); i++)
           cursormask |= 1<<(15-i);
  
***************
*** 758,763 ****
--- 895,933 ----
        custom.color[17] = COLOR_LSB(p->crsrcol);
        custom.bplcon3   = geom->bplcon3;
     }
+    if (boot_info.bi_amiga.chipset == CS_ECS && p->bplcon0 & BPC0_ECSENA) {
+       /*
+        * Calculation of the special ECS color-tables for planes and sprites
+        * is done in the function build_ecs_table
+        */
+ 
+       /*
+        * Calcs a special ECS colortable for the bitplane, and copies it
+        * to the custom registers
+        */
+       build_ecs_colors(COLOR_MSB(p->bgcol), COLOR_MSB(p->fgcol),
+                                                        0, 0, ecs_table); 
+ 
+       for (i = 0; i < 8; i++){
+            custom.color[i]   = ecs_table[i*2];
+            custom.color[i+8] = ecs_table[i*2+1];
+ 	  }
+ 
+       ecs_color_zero = ecs_table[0];
+ 
+       /*
+        * Calcs a special ECS colortable for the cursor sprite, and copies it
+        * to the appropriate custom registers
+        */
+       build_ecs_colors(0, COLOR_MSB(p->crsrcol), 0, 0, ecs_table);
+ 
+       for (i = 0; i < 16; i++){
+            custom.color[i+16] = ecs_table[i];
+           }
+ 
+ 
+       }
+ 
     if (!(geom->isOCS)) {
         /* Need to set up a bunch more regs */
         /* Assumes that diwstrt is in the (0,0) sector, but stop might not be */
***************
*** 782,789 ****
         custom.vbstop	= geom->vbstop;
         custom.hcenter	= geom->hcenter;
         custom.beamcon0	= geom->beamcon0;
!        custom.fmode	= geom->fmode;
! 
         /* We could load 8-bit colors here, if we wanted */
         }
  
--- 952,961 ----
         custom.vbstop	= geom->vbstop;
         custom.hcenter	= geom->hcenter;
         custom.beamcon0	= geom->beamcon0;
!        if (boot_info.bi_amiga.chipset == CS_AGA) {
!            custom.fmode	= geom->fmode;
!           }
!        /* fmode does NOT! excist under ECS, weird things might happen */
         /* We could load 8-bit colors here, if we wanted */
         }
  
***************
*** 904,909 ****
--- 1076,1264 ----
  	704, 296,
  	0x5b, 0x18,
  	16				/* WORD aligned */
+ 	},
+     /* ECS modes, these are real ECS modes */
+     {
+ 	"multiscan", 0,
+ 	BPC0_SHRES | BPC0_ECSENA,			/* bplcon0 */
+ 	640, 480, 1,
+ 	640, 480,
+ 	0x0041, 0x002c,					/* diwstrt h,v */
+         64,	        				/* 64-bit aligned */
+ 	BPC2_KILLEHB,					/* bplcon2 */
+ 	BPC3_PF2OF1 | BPC3_PF2OF0 | BPC3_SPRES1 | BPC3_SPRES0 |
+ 	    BPC3_BRDRBLNK | BPC3_EXTBLKEN,		/* bplcon3 */
+ 
+ 	0x0072,						/* htotal */
+ 	0x000a,						/* hsstrt */
+ 	0x0013,						/* hsstop */
+ 	0x0002,						/* hbstrt */
+ 	0x001c,						/* hbstop */
+ 	0x020c,						/* vtotal */
+ 	0x0008,						/* vsstrt */
+ 	0x0011,						/* vsstop */
+ 	0x0000,						/* vbstrt */
+ 	0x001c,						/* vbstop */
+ 	0x0043,						/* hcenter */
+ 	BMC0_VARVBEN | BMC0_LOLDIS | BMC0_VARVSYEN |
+ 	    BMC0_VARHSYEN | BMC0_VARBEAMEN | BMC0_BLANKEN,	/* beamcon0 */
+ 	FMODE_BPAGEM | FMODE_BPL32			/* fmode */
+     },
+ 	  {
+ 	"multiscan-lace", 0,
+ 	BPC0_SHRES | BPC0_LACE | BPC0_ECSENA,		/* bplcon0 */
+ 	640, 960, 1,
+ 	640, 960,
+ 	0x0041, 0x002c,					/* diwstrt h,v */
+         64,	        				/* 64-bit aligned */
+ 	BPC2_KILLEHB,					/* bplcon2 */
+ 	BPC3_PF2OF1 | BPC3_PF2OF0 | BPC3_SPRES1 | BPC3_SPRES0 |
+ 	    BPC3_BRDRBLNK | BPC3_EXTBLKEN,		/* bplcon3 */
+ 
+ 	0x0072,						/* htotal */
+ 	0x000a,						/* hsstrt */
+ 	0x0013,						/* hsstop */
+ 	0x0002,						/* hbstrt */
+ 	0x001c,						/* hbstop */
+ 	0x020c,						/* vtotal */
+ 	0x0008,						/* vsstrt */
+ 	0x0011,						/* vsstop */
+ 	0x0000,						/* vbstrt */
+ 	0x001c,						/* vbstop */
+ 	0x0043,						/* hcenter */
+ 	BMC0_VARVBEN | BMC0_LOLDIS | BMC0_VARVSYEN |
+ 	    BMC0_VARHSYEN | BMC0_VARBEAMEN | BMC0_BLANKEN,	/* beamcon0 */
+ 	FMODE_BPAGEM | FMODE_BPL32			/* fmode */
+     },
+ 	/* Super 72 - 800x300 72Hz noninterlaced mode. */
+ 	{
+ 	"super72", 0,
+ 	BPC0_SHRES | BPC0_ECSENA,			/* bplcon0 */
+ 	800, 304, 1,					/* need rows%8 == 0 */
+ 	800, 304,					/* (cols too) */
+ 	0x0051, 0x0021,					/* diwstrt h,v */
+ 	64,						/* 64-bit aligned */
+ 	BPC2_KILLEHB,					/* bplcon2 */
+ 	BPC3_PF2OF1 | BPC3_PF2OF0 | BPC3_SPRES1 | BPC3_SPRES0 |
+ 	    BPC3_BRDRBLNK | BPC3_EXTBLKEN,		/* bplcon3 */
+ 	0x0091,						/* htotal */
+ 	0x000a,						/* hsstrt */
+ 	0x0013,						/* hsstop */
+ 	0x0001,						/* hbstrt */
+ 	0x001e,						/* hbstop */
+ 	0x0156,						/* vtotal */
+ 	0x0009,						/* vsstrt */
+ 	0x0012,						/* vsstop */
+ 	0x0000,						/* vbstrt */
+ 	0x001c,						/* vbstop */
+ 	0x0052,						/* hcenter */
+ 	BMC0_VARVBEN | BMC0_LOLDIS | BMC0_VARVSYEN |
+ 	    BMC0_VARHSYEN | BMC0_VARBEAMEN | BMC0_BLANKEN,	/* beamcon0 */
+ 	FMODE_BPAGEM | FMODE_BPL32			/* fmode */
+ 	},
+ 	/* Super 72 lace - 800x600 72Hz interlaced mode. */
+ 	{
+ 	"super72-lace", 0,
+ 	BPC0_SHRES | BPC0_LACE | BPC0_ECSENA,		/* bplcon0 */
+ 	800, 600, 1,					/* need rows%8 == 0 */
+ 	800, 600,					/* (cols too) */
+ 	0x0051, 0x0021,					/* diwstrt h,v */
+ 	64,     					/* 64-bit aligned */
+ 	BPC2_KILLEHB,					/* bplcon2 */
+ 	BPC3_PF2OF1 | BPC3_PF2OF0 | BPC3_SPRES1 | BPC3_SPRES0 |
+ 	    BPC3_BRDRBLNK | BPC3_EXTBLKEN,		/* bplcon3 */
+ 	0x0091,						/* htotal */
+ 	0x000a,						/* hsstrt */
+ 	0x0013,						/* hsstop */
+ 	0x0001,						/* hbstrt */
+ 	0x001e,						/* hbstop */
+ 	0x0150,						/* vtotal */
+ 	0x0009,						/* vsstrt */
+ 	0x0012,						/* vsstop */
+ 	0x0000,						/* vbstrt */
+ 	0x001c,						/* vbstop */
+ 	0x0052,						/* hcenter */
+ 	BMC0_VARVBEN | BMC0_LOLDIS | BMC0_VARVSYEN |
+ 	    BMC0_VARHSYEN | BMC0_VARBEAMEN | BMC0_BLANKEN,	/* beamcon0 */
+ 	FMODE_BPAGEM | FMODE_BPL32			/* fmode */
+ 	},
+ 	/* DblNtsc - 640x400 59Hz noninterlaced mode. */
+ 	{
+ 	"dblntsc", 0,
+ 	BPC0_SHRES | BPC0_ECSENA,			/* bplcon0 */
+ 	640, 400, 1,					/* need rows%8 == 0 */
+ 	640, 400,					/* (cols too) */
+ 	0x0049, 0x0021,					/* diwstrt h,v */
+ 	64,						/* 64-bit aligned */
+ 	BPC2_KILLEHB,					/* bplcon2 */
+ 	BPC3_PF2OF1 | BPC3_PF2OF0 | BPC3_SPRES1 | BPC3_SPRES0 |
+ 	    BPC3_BRDRBLNK | BPC3_EXTBLKEN,		/* bplcon3 */
+ 	0x0079,						/* htotal */
+ 	0x0007,						/* hsstrt */
+ 	0x0013,						/* hsstop */
+ 	0x0001,						/* hbstrt */
+ 	0x001e,						/* hbstop */
+ 	0x01ec,						/* vtotal */
+ 	0x0008,						/* vsstrt */
+ 	0x0010,						/* vsstop */
+ 	0x0000,						/* vbstrt */
+ 	0x0019,						/* vbstop */
+ 	0x0046,						/* hcenter */
+ 	BMC0_VARVBEN | BMC0_LOLDIS | BMC0_VARVSYEN |
+ 	    BMC0_VARHSYEN | BMC0_VARBEAMEN | BMC0_BLANKEN,	/* beamcon0 */
+ 	FMODE_BPAGEM | FMODE_BPL32			/* fmode */
+ 	},
+ 	/* DblPal - 640x512 52Hz noninterlaced mode. */
+ 	{
+ 	"dblpal", 0,
+ 	BPC0_SHRES | BPC0_ECSENA,			/* bplcon0 */
+ 	640, 512, 1,					/* need rows%8 == 0 */
+ 	640, 512,					/* (cols too) */
+ 	0x0049, 0x0021,					/* diwstrt h,v */
+ 	64,						/* 64-bit aligned */
+ 	BPC2_KILLEHB,					/* bplcon2 */
+ 	BPC3_PF2OF1 | BPC3_PF2OF0 | BPC3_SPRES1 | BPC3_SPRES0 |
+ 	    BPC3_BRDRBLNK | BPC3_EXTBLKEN,		/* bplcon3 */
+ 	0x0079,						/* htotal */
+ 	0x0007,						/* hsstrt */
+ 	0x0013,						/* hsstop */
+ 	0x0001,						/* hbstrt */
+ 	0x001e,						/* hbstop */
+ 	0x0234,						/* vtotal */
+ 	0x0008,						/* vsstrt */
+ 	0x0010,						/* vsstop */
+ 	0x0000,						/* vbstrt */
+ 	0x0019,						/* vbstop */
+ 	0x0046,						/* hcenter */
+ 	BMC0_VARVBEN | BMC0_LOLDIS | BMC0_VARVSYEN |
+ 	    BMC0_VARHSYEN | BMC0_VARBEAMEN | BMC0_BLANKEN,	/* beamcon0 */
+ 	FMODE_BPAGEM | FMODE_BPL32			/* fmode */
+ 	},
+ 	/* Euro72 - productivity - 640x400 71Hz noninterlaced mode. */
+ 	{
+ 	"euro72", 0,
+ 	BPC0_SHRES | BPC0_ECSENA,			/* bplcon0 */
+ 	640, 400, 1,					/* need rows%8 == 0 */
+ 	640, 400,					/* (cols too) */
+ 	0x0041, 0x0021,					/* diwstrt h,v */
+ 	64,						/* 64-bit aligned */
+ 	BPC2_KILLEHB,					/* bplcon2 */
+ 	BPC3_PF2OF1 | BPC3_PF2OF0 | BPC3_SPRES1 | BPC3_SPRES0 |
+ 	    BPC3_BRDRBLNK | BPC3_EXTBLKEN,		/* bplcon3 */
+ 	0x0071,						/* htotal */
+ 	0x0009,						/* hsstrt */
+ 	0x0013,						/* hsstop */
+ 	0x0001,						/* hbstrt */
+ 	0x001e,						/* hbstop */
+ 	0x01be,						/* vtotal */
+ 	0x0008,						/* vsstrt */
+ 	0x0016,						/* vsstop */
+ 	0x0000,						/* vbstrt */
+ 	0x001f,						/* vbstop */
+ 	0x0041,						/* hcenter */
+ 	BMC0_VARVBEN | BMC0_LOLDIS | BMC0_VARVSYEN |
+ 	    BMC0_VARHSYEN | BMC0_VARBEAMEN | BMC0_BLANKEN,	/* beamcon0 */
+ 	FMODE_BPAGEM | FMODE_BPL32			/* fmode */
  	},
      /* AGA modes */
      {
